<?php 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                 DMI Alta ADMINISTRATION							//
//																//
//   25/03/11 (Filament) : création de la page											//
//																//
//	Cette page permet de generer et afficher des stats avancees pour DMI							//
//																//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* @package dmi
* @version $Id: dmi_stats.php,v 1.0.0 RC1 2011/03/25 02:03 acydburn Exp $
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
	exit;
}

/**
* @package dmi
*/

class dmi_stats
{
	function main($id, $mode)
	{
		global $db, $user, $auth, $template, $cache;
		global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;

		//Valeur par défaut pour le template et les langues :
		$user->add_lang('dmi/general');
		add_permission_language();

		//Initialisation du tableau des infos :
		$infos = array();	

		//On prend le mode courant
		$mode = (isset($_GET['mode']) && $_GET['mode'] != "") ? $_GET['mode'] : "";

		//Si on a des actions à faire c'est maintenant
		if($mode != null)
		{
			switch($mode)
			{
				case "genere" :
				/*	//Dans un premier temps on check si le mois n'a pas été généré
					$test = "SELECT COUNT(*) as nb
						FROM stats_mois
						WHERE mois = '".date('mY')."'";
					$result = $db->sql_query($test);
					$data = $db->sql_fetchrow($result);
					$db->sql_freeresult($result);
					if($data['nb'] > 0) {
						//Ca existe déjà, faut supprimer
						$del = "DELETE
							FROM stats_mois
							WHERE mois = '".date('mY')."'";
						$db->sql_query($del);
					}

					//Et maintenant, étape par étape on construit nos stats :
					//1. Je mets à jour les posts dans les stats_mois_salon :
					$salons = "SELECT forum_id FROM " . FORUMS_TABLE;
					$result = $db->sql_query($salons);
					while($forum = $db->sql_fetchrow($result)) {
						$test = "SELECT COUNT(*) as nb
							FROM stats_mois_salon
							WHERE mois = '".date('mY')."'
							AND salon = '".$forum['forum_id']."'";
						$result_test = $db->sql_query($test);
						$data_test = $db->sql_fetchrow($result_test);
						$db->sql_freeresult($result_test);
						if($data_test['nb'] > 0) {
							//Ok alors il y a déjà des stats pour ce salon, je me contente d'un update :
							$requete_posts = "UPDATE stats_mois_salon 
									SET posts = (SELECT COUNT(*) FROM ".POSTS_TABLE." WHERE forum_id = '".$forum['forum_id']."' AND post_time > '".mktime(0, 0, 0, date('m')-1  , 1 , date('Y'))."')
									WHERE mois = '".date('mY')."'
									AND salon = '".$forum['forum_id']."'";
						} else {
							//Y'a pas eu encore, donc on crée nous même
							$requete_posts = "INSERT INTO stats_mois_salon (mois, salon, timestamp, posts)
									VALUES ('".date('mY')."', '".$forum['forum_id']."', '".time()."', (SELECT COUNT(*) FROM ".POSTS_TABLE." WHERE forum_id = '".$forum['forum_id']."' AND post_time > '".mktime(0, 0, 0, date('m')-1  , 1 , date('Y'))."'))";
						}
						$db->sql_query($requete_posts);
					}
					$db->sql_freeresult($result);

					//2. Je somme les lectures et posts :
					$insert = "INSERT INTO stats_mois (mois, timestamp, lectures, lectures_anonymes, posts)
							VALUES ('".date('mY')."', '".time()."', (SELECT SUM(lectures) FROM stats_mois_salon WHERE mois = '".date('mY')."'), (SELECT SUM(lectures_anonymes) FROM stats_mois_salon WHERE mois = '".date('mY')."'), (SELECT SUM(posts) FROM stats_mois_salon WHERE mois = '".date('mY')."'))";
					$db->sql_query($insert);

					//3. je calcule la progression générale :
					$progression = "SELECT posts
							FROM stats_mois
							WHERE mois = '".date('mY')."'
							OR mois = '".((date('m')-1).date('Y'))."'
							ORDER BY mois";
					$result = $db->sql_query($progression);
					$posts_mois_courant = $db->sql_fetchfield('posts',1);
					$posts_mois_precedent = $db->sql_fetchfield('posts',0);
					$db->sql_freeresult($result);

					$progression = ($posts_mois_courant - $posts_mois_precedent) * 100 / $posts_mois_precedent;

					$set_progression = "UPDATE stats_mois
								SET progression = '".$progression."'
								WHERE mois = '".date('mY')."'";
					$db->sql_query($set_progression);

					//4. Je calcule les progressions et pourcentages de chaque salon :
					$salons = "SELECT salon FROM stats_mois_salon WHERE mois = '".date('mY')."'";
					$result = $db->sql_query($salons);
					while($forum = $db->sql_fetchrow($result)) {
						//Calcul de la progression :
						$progression = "SELECT posts
								FROM stats_mois_salon
								WHERE salon = '".$forum['salon']."'
								AND (mois = '".date('mY')."'
								OR mois = '".((date('m')-1).date('Y'))."')
								ORDER BY timestamp";
						$result_progression = $db->sql_query($progression);
						$posts_salon_mois_courant = $db->sql_fetchfield('posts',1);
						$posts_salon_mois_precedent = $db->sql_fetchfield('posts',0);
						$db->sql_freeresult($result_progression);

						$progression = ($posts_salon_mois_courant - $posts_salon_mois_precedent) * 100 / $posts_mois_precedent;

						//Calcul du pourcentage :
						if($post_mois_courant != 0)
							$pourcent = $posts_salon_mois_courant * 100 / $posts_mois_courant;
						else
							$pourcent = 0;

						//Et on envoie tout ça :
						$update = "UPDATE stats_mois_salon
								SET progression = '".$progression."',
								 pourcentage_dmi = '".$pourcent."'
								WHERE salon = '".$forum['salon']."'
								AND mois = '".date('mY')."'";
						$db->sql_query($update);
					}
					$db->sql_freeresult($result); */

					//Quand commence t'on ?
					$debut = mktime(0,0,0,date("m")-1,1);

					//Quand s'arrête t'on ?
					$fin = mktime(0,0,0,date("m"),1);

					$this->calcule_stats($debut, $fin);
					break;
				case "initialiser" :
					$this->init();
					break;
				case "continuer" :
					$this->continuer();
					break;
			}
		}

		switch($mode)
		{
			case 'initialiser' :
				$test = "SELECT 
						COUNT(*) as nb
					FROM
						stats_mois";
				$result = $db->sql_query($test);
				$data = $db->sql_fetchrow($result);
				$db->sql_freeresult($result);
				if($data['nb'] > 0) {
					$infos[] = "La base a d&eacute;ja &eacute;&eacute; g&eacute;n&eacute;r&eacute;e, utilisez plut&ocirc:t continuer.";
				}
			default :
			case 'continuer' :
			case 'voir' :
				$this->tpl_name = 'stats/dmi_stats';

				//On teste si les stats de ce mois sont déjà generees :
				$test = "SELECT COUNT(*) as nb
					FROM stats_mois
					WHERE mois = '".date('mY')."'";
				$result = $db->sql_query($test);
				$data = $db->sql_fetchrow($result);
				$db->sql_freeresult($result);

				$template->assign_vars(array(
						'MOIS_NON_GENERE' => ($data['nb'] == 0) ? "Les stats pour ce mois n'ont pas encore &eacute;t&eacute; calculees. Vous pouvez le faire en cliquant dans le menu de gauche." : null,
					));

				//Utile pour afficher les mois en français :
				$moisFr = array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Decembre');


				//les informations pour le tableau récapitulatif :
				$infos_stats = "SELECT * 
					FROM stats_mois
					ORDER BY timestamp DESC
					LIMIT 0,10";
				$result = $db->sql_query($infos_stats);
				while($info = $db->sql_fetchrow($result)) {
					$template->assign_block_vars('infos_stats', array(
						'MOIS' => $moisFr[substr($info['mois'],0,2)-1].' '.substr($info['mois'],2,4),
						'PROGRESSION' => $info['progression'].'%',
						'POSTS'	=> $info['posts'],
						'LECTURES' => $info['lectures'],
					));
				}
				$db->sql_freeresult($result);
				break;
			case 'voir_salon' :
				$this->tpl_name = 'stats/dmi_stats_salon';
				//Quoi qu'il se passe on propose la liste des salons :
				make_jumpbox(append_sid("index.php?&i=stats&mode=voir_salon"));

				//Est ce qu'on a un salon choisi ?
				if(isset($_POST['f']) && !empty($_POST['f'])) {
					//Quelles sont les informations sur ce salon ?
					$infos_salon = "SELECT forum_name
							FROM " . FORUMS_TABLE ."
							WHERE forum_id = '".$_POST['f']."'";
					$result_infos_salon = $db->sql_query($infos_salon);
					$infos_salon = $db->sql_fetchrow($result_infos_salon);
					$db->sql_freeresult($result_infos_salon);
					$template->assign_vars(array(
						'NOM_SALON' => $infos_salon['forum_name'],
						'ID_SALON' => $_POST['f']
					));

					//On teste si les stats de ce mois sont déjà generees :
					$test = "SELECT COUNT(*) as nb
						FROM stats_mois_salon
						WHERE mois = '".date('mY')."'
						AND salon = '".$_POST['f']."'";
					$result = $db->sql_query($test);
					$data = $db->sql_fetchrow($result);
					$db->sql_freeresult($result);

					$template->assign_vars(array(
							'MOIS_NON_GENERE' => ($data['nb'] == 0) ? "Les stats de ce salon pour ce mois n'ont pas encore &eacute;t&eacute; calculees. Vous pouvez le faire en cliquant dans le menu de gauche." : null,
						));

					//Utile pour afficher les mois en français :
					$moisFr = array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Decembre');


					//les informations pour le tableau récapitulatif :
					$infos_stats = "SELECT * 
						FROM stats_mois_salon
						WHERE salon = '".$_POST['f']."'
						ORDER BY timestamp DESC
						LIMIT 0,10";
					$result = $db->sql_query($infos_stats);
					while($info = $db->sql_fetchrow($result)) {
						$template->assign_block_vars('infos_stats', array(
							'MOIS' => $moisFr[substr($info['mois'],0,2)-1].' '.substr($info['mois'],2,4),
							'PROGRESSION' => $info['progression'].'%',
							'POSTS'	=> $info['posts'],
							'LECTURES' => $info['lectures'],
							'LECTURES_ANONYMES' => $info['lectures_anonymes'],
							'POURCENT' => $info['pourcent'],
						));
					}
					$db->sql_freeresult($result);
				}
				break;
			case "genere" :
				$this->tpl_name = 'stats/dmi_stats';
				break;
		}

		//Si jamais on a une information à afficher, on l'affiche :
		if(!empty($infos)) {
			foreach ($infos as  $info_msg)
			{
				//Cette méthode permet de confirmer les actions
				$template->assign_block_vars('infos', array(
					'INFO_MSG'  => $info_msg,
				));
			}
		}

		//On envoie les erreurs relevées si erreurs il y a :
		if(!empty($erreurs)) {
			foreach ($erreurs as  $erreur_msg)
			{
				//Cette méthode permet de faire varier sans soucis le nombre d'erreurs afin de 					// guider au mieux le rédacteur du dossier
			    $template->assign_block_vars('erreurs', array(
				'ERREUR_MSG'  => $erreur_msg,
			    ));
			}
		}

	}

	private function init() {
		global $db, $infos;
		//bon on va tout vider, si le membre s'est planté de lien, ben fallait pas se planter
		$vider = "TRUNCATE TABLE `stats_mois`";
		$db->sql_query($vider);
		$infos[] = "Table stats_mois vid&eacute;e";
		$vider = "TRUNCATE TABLE `stats_mois_salon`";
		$db->sql_query($vider);
		$infos[] = "Table stats_mois_salon vid&eacute;e";

		//De quand date le premier message ?
		$debut_sql = "SELECT post_time
				FROM ".POSTS_TABLE."
				ORDER BY post_time ASC
				LIMIT 0,1";
		$result_debut = $db->sql_query($debut_sql);
		$debut_sql = $db->sql_fetchrow($result_debut);
		$debut = $debut_sql['post_time'];
		$db->sql_freeresult($result_debut);

		//Quand s'arrête t'on ?
		$fin = mktime(0,0,0,date("m")-3,1);

		$this->calcule_stats($debut, $fin);

		$infos[] = "Statistiques g&eacute;n&eacute;r&eacute;es.";

		$erreurs[] = 'Pensez &agrave; supprimer le lien vers cette section pour ne pas perdre d\'informations.';

	}

	private function continuer() {
		global $db, $infos, $erreurs;

		//Ou s'était on arrêté ?
		$select_debut = "SELECT 
					s.mois
					, s.timestamp
				FROM
					stats_mois s
				ORDER BY
					s.timestamp DESC
				LIMIT 0,1";
		$result = $db->sql_query($select_debut);
		$debut = $db->sql_fetchrow($result);
		$db->sql_freeresult($result);
		$tmp_debut = mktime(0,0,0,date('m', $debut['timestamp'])+1,1,date('Y',$debut['timestamp']));
		
		//Quand s'arrête t'on ?
		$fin = mktime(0,0,0,date("m"),1);

		//On lance le calcul :
		$this->calcule_stats($tmp_debut, $fin);
	}

	private function calcule_stats($debut, $fin) {
		global $db;

		//Quels seront les salons à tester ?
		$salons = "SELECT forum_id FROM " . FORUMS_TABLE;
		$result_salons = $db->sql_query($salons);
		$salons = $db->sql_fetchrowset($result_salons);
		$db->sql_freeresult($result_salons);

		//Maintenant on va depuis le début du forum et mois par mois calculer le nombre de posts total et par salon...
		$tmp_fin = $debut;
		$test_start = 0;
		while($tmp_fin < $fin) {
			//tmp fin est la fin du mois par rapport à début :
			$tmp_fin = mktime(0,0,0,date('m', $debut)+1,1,date('Y',$debut));

			//Dans un premier temps on check si le mois n'a pas été généré
			$test = "SELECT COUNT(*) as nb
				FROM stats_mois
				WHERE mois = '".date('mY', $debut)."'";
			$result = $db->sql_query($test);
			$data = $db->sql_fetchrow($result);
			$db->sql_freeresult($result);
			if($data['nb'] > 0) {
				//Ca existe déjà, faut supprimer
				$del = "DELETE
					FROM stats_mois
					WHERE mois = '".date('mY',$debut)."'";
				$db->sql_query($del);

				$del = "DELETE
					FROM stats_mois_salon
					WHERE mois = '".date('mY',$debut)."'";
				$db->sql_query($del);
			}

			//Et maintenant pour chaque salon :
			while ($salon = current($salons)) {
				$compte = "INSERT INTO stats_mois_salon (mois, timestamp, salon, posts)
					VALUES ('".date('mY',$debut)."', '".$debut."', '".$salon['forum_id']."', (SELECT COUNT(*) FROM ".POSTS_TABLE." WHERE forum_id = '".$salon['forum_id']."' AND post_time > '".$debut."' AND post_time < '".$tmp_fin."'))";
				$db->sql_query($compte);
				next($salons);
			}
			reset($salons);

			//Et le total du mois :
			$total_mois = "INSERT INTO stats_mois (mois, timestamp, posts)
					VALUES ('".date('mY',$debut)."', '".$debut."', (SELECT SUM(posts) FROM stats_mois_salon WHERE mois = '".date('mY',$debut)."'))";
			$db->sql_query($total_mois);

			//Le calcul de la progression :
			if($test_start == 1) {
				$progression = "SELECT posts
						FROM stats_mois
						ORDER BY timestamp DESC
						LIMIT 0,2";
				$result = $db->sql_query($progression);
				$posts_mois_courant = $db->sql_fetchfield('posts',0);
				$posts_mois_precedent = $db->sql_fetchfield('posts',1);
				$db->sql_freeresult($result);

				if($posts_mois_precedent == 0)
					$progression = 100;
				else
					$progression = ($posts_mois_courant - $posts_mois_precedent) * 100 / $posts_mois_precedent;

				$set_progression = "UPDATE stats_mois
						SET progression = '".$progression."'
						WHERE mois = '".date('mY', $debut)."'";
				$db->sql_query($set_progression);
						

				//Calcul de la progression par mois :
				while ($salon = current($salons)) {
					//Calcul de la progression :
					$progression = "SELECT posts
							FROM stats_mois_salon
							WHERE salon = '".$salon['forum_id']."'
							ORDER BY timestamp DESC
							LIMIT 0,2";
					$result_progression = $db->sql_query($progression);
					$posts_salon_mois_courant = $db->sql_fetchfield('posts',0);
					$posts_salon_mois_precedent = $db->sql_fetchfield('posts',1);
					$db->sql_freeresult($result_progression);

					if($posts_salon_mois_precedent == 0 && $posts_salon_mois_courant == 0)
						$progression = 0;
					elseif($posts_salon_mois_precedent == 0)
						$progression = 100;
					else
						$progression = ($posts_salon_mois_courant - $posts_salon_mois_precedent) * 100 / $posts_mois_precedent;

					//Calcul du pourcentage :
					if($post_mois_courant != 0)
						$pourcent = $posts_salon_mois_courant * 100 / $posts_mois_courant;
					else
						$pourcent = 0;

					//Et on envoie tout ça :
					$update = "UPDATE stats_mois_salon
						SET progression = '".$progression."',
							pourcentage_dmi = '".$pourcent."'
						WHERE salon = '".$salon['forum_id']."'
							AND mois = '".date('mY',$debut)."'";
						$db->sql_query($update);
						next($salons);
					}
					reset($salons);
				}

				//Et on fait avancer $debut :
				$debut = $tmp_fin;

				//Et hop !
				$test_start = 1;
			}
	}
}

?>
